// Generics

// 1.场景需要接受什么返回什么，可能是string,number...很多类型
// function echo(arg: any): any{
//   return arg
// }
// 做不到限制
// const ret: string = echo(123)

// 定义接口和类的时候不指定类型，只是在使用中指定类型
// 申明T占位符号
function echo<T>(arg: T): T {
  return arg
}

const ret: boolean = echo(true)
const ret1: string = echo("str")
const ret2: number = echo(123)


// 2.需求传入多个参数，调换位置
// function swap(tuple){
//   return [tuple[1],tuple[0]]
// }

function swap<T, U>(tuple: [T, U]): [U, T] {
  return [tuple[1], tuple[0]]
}

const retArr = swap(["string", 1223])
// 这样可以retArr[0]使用number类型属性
console.log(retArr[0].toString())
// 这样可以retArr[1]使用string类型属性
console.log(retArr[1].indexOf("i"))